/**
 * Copyright(c) 2014 Xunton Solutions
 *
 * History:
 *   14-12-23 下午2:11 Created by dwzhang
 */
package com.jade.bss.beacon;

import java.util.List;

import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;

/**
 * Beacon数据访问接口。
 *
 * @author <a href="mailto:dwzhang@xunton.com">dwzhang</a> 
 * @version 1.0 14-12-23 下午2:11
 */
public interface BeaconDao
{
    /**
     * 创建beacon。
     *
     * @throws BeaconException 处理异常
     * @param beacon beacon信息。
     */
    public void addBeacon(Beacon beacon)
            throws BeaconException;

    /**
     * 更新beacon信息。
     *
     * @param beacon beacon信息。
     * @throws BeaconException 处理异常
     */
    public void updateBeacon(Beacon beacon)
            throws BeaconException;

    /**
     * 更新beacon信息。
     *
     * @param id beacon标识
     * @param status beacon状态信息。
     * @throws BeaconException 处理异常
     */
    public int updateStatus(long id, int status) throws BeaconException;

    /**
     * 根据标识获取beacon信息。
     *
     * @param id beacon标识
     * @return beacon信息对象。
     */
    public Beacon getBeacon(long id);

    /**
     * 删除beacon信息。
     *
     * @param id beacon标识
     */
    public void removeBeacon(long id)
            throws BeaconException;

    /**
     * 根据条件列出beacon.
     *
     * @param criteria 查询条件
     * @return beacon列表
     */
    public List<Beacon> listBeacon(Criteria criteria);

    /**
     * 根据条件查询beacon。
     *
     * @param criteria 查询条件
     * @return 满足条件的beacon列表。
     */
    public PagingList<Beacon> queryBeacon(Criteria criteria);

    /**
     * 添加beacon事件记录。
     *
     * @param record beacon事件记录。
     * @throws BeaconException 处理异常。
     */
    public void addBeaconEvent(BeaconEventRecord record)
        throws BeaconException;

    Beacon getBeacon(String uuid, int major, int minor);

    Beacon getBeaconByMac(String mac);

    PagingList<Beacon> queryBeacon(Criteria criteria, Class... infos);

    <Info extends BeaconExtInfo> Info getInfo(long beaconId, Class infoClass);

    void addInfo(BeaconExtInfo info)
            throws BeaconException;

    void updateInfo(BeaconExtInfo info)
            throws BeaconException;

    void removeInfo(BeaconExtInfo info)
            throws BeaconException;

    public long getBeaconCount(Criteria criteria);
}
